home *** CD-ROM | disk | FTP | other *** search
/ The PC-SIG Library 9 / The PC-SIG Library on CD ROM - Ninth Edition.iso / 301_400 / DISK0324 / DISK0324.ZIP / PTOOLENT.INC < prev    next >
Text File  |  1985-02-21  |  20KB  |  522 lines

  1. { PTOOLENT.INC   Copyright 1984  R D Ostrander                   Version 1.0
  2.                                  Ostrander Data Services
  3.                                  5437 Honey Manor Dr
  4.                                  Indianapolis  IN  46241
  5.  
  6.  This Turbo Pascal include file is a display and data entry tool. It Displays
  7.  a given String (or Character Array), Integer, or Real (Dollar) data field
  8.  in a given screen area and allows the operator to make changes via the
  9.  keyboard. It allows the operator to end the editting using many ending
  10.  keys and passes information about those keys to the calling program.
  11.  
  12.  This program has been placed in the Public Domain by the author and copies
  13.  may be freely made for non-commercial, demonstration, or evaluation purposes.
  14.  Use of these subroutines in a program for sale or for commercial purposes in
  15.  a place of business requires a $20 fee be paid to the author at the address
  16.  above.  Personal non-commercial users may also elect to pay the $20 fee to
  17.  encourage further development of this and similar programs. With payment you
  18.  will be able to receive update notices, diskettes and printed documentation
  19.  of this and other PTOOLs from Ostrander Data Services.
  20.  
  21.  PTOOL, PTOOLxxx, PDEMO, and PDEMOxxx are Copyright Trademarks of
  22.                                                     Ostrander Data Services.
  23.  Turbo Pascal is a Copyright of Borland International Inc.
  24.  
  25.  Call format is:
  26.  
  27.     Set Data            <String, Integer, or Real>      initial display value.
  28.     Set DataType        <Char>                                   type of edit.
  29.     Set DisplaySize     <Integer>                number of spaces for display.
  30.     Set DisplayDecimals <Integer>                       for Real numbers only.
  31.     Set ReturnCode      <Integer>      need not be set but must be a variable.
  32.     GoToXY (X, Y)                            to set the Display Area location.
  33.     PTOOLENT (Data, DataType, DisplaySize, DisplayDecimals, ReturnCode);
  34.  
  35.     Examples:     Var CustomerName : String [24];
  36.                       ReturnCode   : Integer;
  37.                   Begin
  38.                   CustomerName := ' ';
  39.                   Gotoxy (1,1)
  40.                   PTOOLENT (CustomerName, 'S', 24, 0, ReturnCode);
  41.  
  42.     See companion program PDEMOENT.PAS for further examples.
  43.  
  44.     Note that the DisplaySize must be > DisplayDecimals + 1.
  45.  
  46.     Invalid data and cursor movements cause beeps to the operator.
  47.  
  48.  Editting Keys are:
  49.  
  50.          Left Arrow       : Move cursor to left
  51.          Right Arrow      : Move cursor to right
  52.          Ctrl-Left Arrow  : Move cursor to 1st position
  53.          Ctrl-Right Arrow : Move cursor past last character
  54.          Tab              : Move cursor right to next word
  55.          Shift-Tab        : Move cursor left to previous word
  56.          Backspace        : Erase character to left of cursor
  57.          Del              : Erase character under cursor
  58.          Ctrl-E           : Erase editting area
  59.          Ctrl-F           : Fill field with character to left of cursor
  60.          Ctrl-X           : Erase all characters from cursor on
  61.          Ctrl-L           : Left justify data
  62.          Ctrl-R           : Right justify data
  63.          Ctrl-S           : Start Editting over
  64.          Ctrl-N or Ctrl-Q : Quit with no change in data
  65.          Ctrl-P           : Retreive Previous data or Ctrl-E(rased) data
  66.          Ctrl-U           : Change all data to Upper Case
  67.          Ctrl-D           : Change all data to Lower Case
  68.          Ins              : Toggle Insert function on/off
  69.          Alt-Numerics may be used to enter character graphics codes
  70.  
  71.   Edit Return codes are:
  72.  
  73.                   0 = Esc
  74.                   1 = C/R or Ctrl-N or Ctrl-Q
  75.                   2 = (Filled Field)
  76.                   3 = Ctrl-Break/Ctrl-C (if $C- not set)
  77. 16-26, 30-38, 44,50 = Alt-Alphabetics
  78.               59-68 = F1 - F10
  79.                  71 = Home
  80.                  72 = Up Arrow
  81.                  73 = PgUp
  82.                  79 = End
  83.                  80 = Down Arrow
  84.                  81 = PgDn
  85.               84-93 = Shift F1 - F10
  86.              94-103 = Ctrl F1 - F10
  87.             104-113 = Alt F1 - F10
  88.                 114 = Ctrl-PrtSc
  89.                 117 = Ctrl-End
  90.                 118 = Ctrl-PgDn
  91.                 119 = Ctrl-Home
  92.                 132 = Ctrl-PgUp                        }
  93.  
  94. Procedure PTOOLENT
  95.  
  96.      (Var
  97.       Data;                       { Data to Edit                }
  98.       TypeData    : Char;         { Data Type -  I = Integer    }
  99.                                   {              R = Real       }
  100.                                   {              S = String     }
  101.       Size,                       { Display Size - 1 to 80      }
  102.       Decimals    : Integer;      { Number of Decimal Places    }
  103.       Var
  104.       OutEndCode  : Integer);     { Output Ending Code          }
  105.  
  106.  
  107.  
  108. Var
  109.  
  110.    PassI       : Integer       absolute Data;
  111.    PassR       : Real          absolute Data;
  112.    PassS       : String [80]   absolute Data;
  113.    Ch          : Char;
  114.    Ch2         : Char;
  115.    CurrS       : String [80];
  116.    SaveS       : String [80];
  117.    I           : Integer;
  118.    J           : Integer;
  119.    DispX       : Integer;
  120.    DispY       : Integer;
  121.    Done        : Boolean;
  122.    ErrCode     : Integer;
  123.    Dot         : Char;
  124.    DisplayType : Char;
  125.  
  126.  
  127. Const
  128.  
  129.    InsertKey   : Boolean = False;
  130.    PrevS       : String [80] = 'No data available';
  131.  
  132.  
  133. Function PowerOf (Number, Power : Integer) : Real;
  134.  
  135.      Var
  136.         J    : Integer;
  137.         Work : Real;
  138.  
  139.      Begin
  140.           Work := Number;
  141.           For J := 1 to Power - 1 do
  142.               Work := Work * 10;
  143.           PowerOf := Work;
  144.      End;
  145.  
  146.  
  147. Function LowCase (Ch : Char) : Char;
  148.  
  149.      Begin
  150.           If Ord (Ch) in [65 .. 90] then
  151.              LowCase := Char (Ord (Ch) + 32)
  152.           else
  153.              LowCase := Ch;
  154.      End;
  155.  
  156.  
  157. Procedure Beep;
  158.  
  159.      Begin
  160.           Sound (880);
  161.           Delay (150);
  162.           NoSound;
  163.      End;
  164.  
  165. Procedure Display;
  166.  
  167.      Begin
  168.           Gotoxy (DispX, DispY);
  169.           CurrS [0] := Char(Size);
  170.           Write (CurrS);
  171.      End;
  172.  
  173. Procedure AddASpace;
  174.  
  175.      Begin
  176.           Insert (Dot, CurrS, Size + 1);
  177.      End;
  178.  
  179. Procedure LeftJustify;
  180.  
  181.      Begin
  182.           For J := 1 to Size do
  183.               If CurrS [1] = Dot then
  184.                  Begin
  185.                       Delete (CurrS, 1, 1);
  186.                       AddASpace;
  187.                  End;
  188.      End;
  189.  
  190. Procedure InsertSwitch;
  191.  
  192. type
  193.     BiosCall = Record
  194.                Ax, Bx, Cx, Dx, Bp, Si, Ds, Es, Flags : Integer;
  195.                End;
  196.     XferArea = Record
  197.                Case Boolean of
  198.                     True  : (Lo, Hi : Byte);
  199.                     False : (I : Integer);
  200.                End;
  201.  
  202. var
  203.     BiosRec            : BiosCall;
  204.     XferRec            : XferArea;
  205.     Upper, Lower       : byte;
  206.  
  207.      Procedure ChangeCursor;
  208.  
  209.      Begin
  210.           XferRec.Lo := 0;        {Get Current Mode}
  211.           XferRec.Hi := 15;
  212.           BiosRec.Ax := XferRec.I;
  213.           Intr(16,BiosRec);
  214.           XferRec.I := BiosRec.Ax;
  215.           If Odd (XferRec.Lo) = False then DisplayType := 'M'
  216.                                       else DisplayType := 'C';
  217.           XferRec.Lo := 0;
  218.           XferRec.Hi := 1;
  219.           BiosRec.Ax := XferRec.I;
  220.           If DisplayType = 'C' then
  221.              Begin
  222.                   XferRec.Lo := 7;
  223.                   If InsertKey = True then XferRec.Hi := 4
  224.                                       else XferRec.Hi := 6;
  225.              End
  226.                   else
  227.              Begin
  228.                   XferRec.Lo := 13;
  229.                   If InsertKey = True then XferRec.Hi := 9
  230.                                       else XferRec.Hi := 12;
  231.              End;
  232.           BiosRec.Cx := XferRec.I;
  233.           Intr(16, BiosRec);
  234.      End;
  235.  
  236.  
  237. Begin
  238.      If InsertKey = True then InsertKey := False
  239.                          else InsertKey := True;
  240.      ChangeCursor;
  241. End;
  242.  
  243.  
  244. Label
  245.  
  246.      DisplayPoint;
  247.  
  248.  
  249. BEGIN
  250.  
  251.      Dot     := Char (250);
  252.      Done    := False;
  253.      ErrCode := 0;
  254.      DispX   := WhereX;
  255.      DispY   := WhereY;
  256.      FillChar (CurrS, Size + 1, Dot);
  257.      Case TypeData of
  258.           'I' : If PassI <> 0 then Str (PassI:Size, CurrS);
  259.           'R' : If PassR <> 0 then Str (PassR:Size:Decimals, CurrS);
  260.           'S' : CurrS := PassS;
  261.           End; {Case}
  262.      If (TypeData = 'I') or (TypeData = 'R') then
  263.           For I := 1 to Size do
  264.               If CurrS [1] = ' ' then
  265.                  Begin
  266.                       Delete (CurrS, 1, 1);
  267.                       AddASpace;
  268.                  End;
  269.      For I := 1 to Size do
  270.          If CurrS [I] = ' ' then CurrS [I] := Dot;
  271.      CurrS [0] := Char (Size);
  272.      I := 1;
  273.      SaveS := CurrS;
  274.   DisplayPoint:
  275.      Display;
  276.      While NOT Done Do
  277.            Begin
  278.                 If I < 1 then
  279.                    Begin
  280.                         I := 1;
  281.                         Beep;
  282.                    End;
  283.                 If I > Size then
  284.                    Begin
  285.                         I := Size;
  286.                         Beep;
  287.                    End;
  288.                 Gotoxy (DispX + I - 1, DispY);
  289.                 Ch  := Char(00);
  290.                 Ch2 := Char(00);
  291.                 Read (KBD, Ch);
  292.                 If Keypressed then Read (KBD, Ch2);
  293.                 If Ord(Ch) = 27 then
  294.                    Case Ord(Ch2) of
  295.        {Back Tab       }  15 :
  296.                                Begin
  297.                                     I := I - 1;
  298.                                     While ((CurrS [I] = Dot) or
  299.                                            (CurrS [I] = '.'))
  300.                                       and (I > 1) do
  301.                                           I := I - 1;
  302.                                     While (CurrS [I] <> Dot)
  303.                                       and (CurrS [I] <> '.')
  304.                                       and (I > 1) do
  305.                                           I := I - 1;
  306.                                     If (CurrS [I] = Dot) or
  307.                                        (CurrS [I] = '.') then I := I + 1;
  308.                                End;
  309.        {Left Arrow     }  75 : I := I -1;
  310.        {Right Arrow    }  77 : I := I +1;
  311.        {Ins            }  82 : InsertSwitch;
  312.        {Del            }  83 : Begin
  313.                                     Delete (CurrS, I, 1);
  314.                                     AddASpace;
  315.                                     Display;
  316.                                End;
  317.        {Ctrl-LeftArrow } 115 : If I = 1 then Beep
  318.                                         else I := 1;
  319.        {Ctrl-RightArrow} 116 : Begin
  320.                                     I := Size;
  321.                                     While (CurrS [I] = Dot)
  322.                                       and (I > 0) do
  323.                                           I := I - 1;
  324.                                     If I < Size then
  325.                                        I := I + 1;
  326.                                End;
  327.                           else Begin
  328.                                     Done := True;
  329.                                     OutEndCode := Ord(Ch2);
  330.                                End;
  331.                         End {Case}
  332.                     else
  333.                    Begin
  334.                         If Ord (Ch) = 32 then
  335.                            Ch := Dot;
  336.                         Case Ord(Ch) of
  337.        {Ctrl-C         }      3 : Begin
  338.                                        Done := True;
  339.                                        OutEndCode := 3;
  340.                                   End;
  341.        {Ctrl-D         }      4 : Begin
  342.                                        For J := 1 to Size do
  343.                                            CurrS [J] := LowCase (CurrS [J]);
  344.                                        Display;
  345.                                   End;
  346.        {Ctrl-E         }      5 : Begin
  347.                                        PrevS := CurrS;
  348.                                        FillChar (CurrS [1], Size, Dot);
  349.                                        Display;
  350.                                        I := 1;
  351.                                   End;
  352.        {Ctrl-F         }      6:  Begin
  353.                                        If I > 1 then J := I - 1
  354.                                                 else J := 1;
  355.                                        FillChar (CurrS [J + 1], Size - J,
  356.                                                  CurrS [J]);
  357.                                        Display;
  358.                                   End;
  359.        {Backspace      }      8 : If I > 1 then
  360.                                      Begin
  361.                                           Delete (CurrS, I - 1, 1);
  362.                                           AddASpace;
  363.                                           Display;
  364.                                           I := I - 1;
  365.                                      End
  366.                                      else Beep;
  367.        {Tab            }      9 : Begin
  368.                                        While (CurrS [I] <> Dot)
  369.                                          and (CurrS [I] <> '.')
  370.                                          and (I < Size) do
  371.                                              I := I + 1;
  372.                                        While ((CurrS [I] = Dot) or
  373.                                               (CurrS [I] = '.'))
  374.                                          and (I < Size) do
  375.                                              I := I + 1;
  376.                                   End;
  377.        {Ctrl-L         }     12 : Begin
  378.                                        LeftJustify;
  379.                                        Display;
  380.                                        I := 1;
  381.                                   End;
  382.        {C/R            }     13 : Begin
  383.                                        Done := True;
  384.                                        OutEndCode := 1;
  385.                                   End;
  386.        {Ctrl-N         }     14 : Begin
  387.                                        CurrS := SaveS;
  388.                                        Done := True;
  389.                                        OutEndCode := 1;
  390.                                   End;
  391.        {Ctrl-P         }     16 : Begin
  392.                                        For I := 1 to Size do
  393.                                            CurrS [I] := PrevS [I];
  394.                                        I := 1;
  395.                                        Display;
  396.                                   End;
  397.        {Ctrl-Q         }     17 : Begin
  398.                                        CurrS := SaveS;
  399.                                        Done := True;
  400.                                        OutEndCode := 1;
  401.                                   End;
  402.        {Ctrl-R         }     18 : Begin
  403.                                        I := Size;
  404.                                        While (CurrS [I] = Dot)
  405.                                          and (I > 0) do
  406.                                              I := I - 1;
  407.                                        If I < Size then
  408.                                           Begin
  409.                                                J := Size - I;
  410.                                                For I := 1 to J do
  411.                                                    Insert (Dot, CurrS, 1);
  412.                                           End;
  413.                                        I := 1;
  414.                                        While CurrS [I] = Dot do
  415.                                              I := I + 1;
  416.                                        Display
  417.                                   End;
  418.        {Ctrl-S         }     19 : Begin
  419.                                        CurrS := SaveS;
  420.                                        I := 1;
  421.                                        Goto DisplayPoint;
  422.                                   End;
  423.        {Ctrl-U         }     21 : Begin
  424.                                        For J := 1 to Size do
  425.                                            CurrS [J] := UpCase (CurrS [J]);
  426.                                        Display;
  427.                                   End;
  428.        {Ctrl-X         }     24 : Begin
  429.                                        FillChar (CurrS [I], Size - I + 1,
  430.                                                  Dot);
  431.                                        Display;
  432.                                   End;
  433.                         else If InsertKey = False then
  434.                                 Begin
  435.                                      Write (Ch);
  436.                                      CurrS [I] := Ch;
  437.                                      I := I + 1;
  438.                                      If I > Size then
  439.                                         Begin
  440.                                              Done := True;
  441.                                              OutEndCode := 2;
  442.                                         End;
  443.                                 End
  444.                                  else
  445.                                 Begin
  446.                                      Insert (Ch, CurrS, I);
  447.                                      I := I + 1;
  448.                                      Display;
  449.                                      If I > Size then
  450.                                         Begin
  451.                                              Done := True;
  452.                                              OutEndCode := 2;
  453.                                         End;
  454.                                 End;
  455.                         End; {Case}
  456.                    End;
  457.            End;
  458.  
  459.     If (TypeData = 'I')
  460.     or (TypeData = 'R') then
  461.        Begin
  462.             LeftJustify;
  463.             I := 1;
  464.             While (CurrS [I] <> Dot)
  465.               and (I <= Size) do
  466.                   I := I + 1;
  467.             For J := I to Size do
  468.                 If CurrS [J] <> Dot then
  469.                    Begin
  470.                         Beep;
  471.                         I := J - 1;
  472.                         Done := False;
  473.                         Goto DisplayPoint;
  474.                    End;
  475.             CurrS [0] := Char (I - 1);
  476.        End;
  477.     If InsertKey = True then InsertSwitch;
  478.     ErrCode := 0;
  479.     If TypeData = 'I' then
  480.        Val (CurrS, PassI, ErrCode);
  481.     If TypeData = 'R' then
  482.        Begin
  483.             Val (CurrS, PassR, ErrCode);
  484.             If Decimals > 0 then
  485.                Begin
  486.                     If (PassR >= PowerOf (10, Size - Decimals - 1))
  487.                     or (PassR <= PowerOf (10, Size - Decimals - 2) * -1) then
  488.                        Begin
  489.                             Beep;
  490.                             I := 1;
  491.                             Done := False;
  492.                             Goto DisplayPoint;
  493.                             End;
  494.                End;
  495.        End;
  496.     If ErrCode <> 0 then
  497.        Begin
  498.             Beep;
  499.             Done := False;
  500.             I := ErrCode;
  501.             Goto DisplayPoint;
  502.        End;
  503.     If TypeData = 'S' then
  504.        Begin
  505.             For I := 1 to Size do
  506.                 If CurrS [I] = Dot then CurrS [I] := ' ';
  507.             CurrS [0] := Char (Size);
  508.             PassS := CurrS;
  509.        End;
  510.  
  511.     FillChar (PrevS, 80, Dot);
  512.     PrevS := CurrS;
  513.     Gotoxy (DispX, DispY);
  514.     Case TypeData of
  515.          'S' : Write (PassS);
  516.          'I' : Write (PassI:Size);
  517.          'R' : Write (PassR:Size:Decimals);
  518.          End; {case}
  519.     Gotoxy (DispX, DispY);
  520.  
  521. END;
  522.